<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">

<title>class SyntaxSuggest::CaptureCodeContext - syntax_suggest: Ruby Standard Library Documentation</title>


<script src="../js/navigation.js" defer></script>
<script src="../js/search.js" defer></script>
<script src="../js/search_index.js" defer></script>
<script src="../js/searcher.js" defer></script>
<script src="../js/darkfish.js" defer></script>

<script src="../js/jquery-3.2.0.min.js"></script>

<script src="../js/vue.min.js"></script>
<script src="../js/js.cookie.min.js"></script>

<link href="../css/fonts.css" rel="stylesheet">
<link id='rdoccss' href="../css/rdoc.css" rel="stylesheet">
<link href="../css/carbon17.css" rel="stylesheet">

<script type="text/javascript">
  var rdoc_rel_prefix = "../";
  var index_rel_prefix = "../";
  var darkModeCsseHref = "../css/rdoc-dm.css"
  var defaultModeCssHref = "../css/rdoc.css"
  // var cssDarkmode = Cookies.get('darkmode');
  
  if( Cookies.get("darkmode") == "true") {
	$('#rdoccss').attr("href", darkModeCsseHref);
}

//  https://cssdeck.com/blog/simple-jquery-stylesheet-switcher/

document.write('<style type="text/css">body{display:none}</style>');

</script>


</head>
<body id="top" role="document" class="class">
  <!-- this is class.html -->

  <div id='actionbar' >
    <div class='wrapper mdiv'>
      <ul class='grids g0'></ul>
    </div> 
    <!-- VERSION HEADER for 3.3.0.preview2 NOT FOUND -->
  </div> <!-- end action bar -->

  <div class='wrapper hdiv'>

    


    <nav id='vapp' role="navigation">
    <div id="project-navigation">
      <div id="home-section" role="region" title="Quick navigation" class="nav-section">
  <h2><a href="../index.html" rel="home">Home</a></h2>

  <div id="table-of-contents-navigation"  >
    <a href="../table_of_contents.html#pages">Pages</a>
    <a href="../table_of_contents.html#classes">Classes</a>
    <a href="../table_of_contents.html#methods">Methods</a>
  </div>
</div>

      <div id="search-section" role="search" class="project-section initially-hidden">
  <form action="#" method="get" accept-charset="utf-8">
    <div id="search-field-wrapper">
      <input id="search-field" role="combobox" aria-label="Search"
             aria-autocomplete="list" aria-controls="search-results"
             type="text" name="search" placeholder="Search" spellcheck="false"
             title="Type to search, Up and Down to navigate, Enter to load">
    </div>

    <ul id="search-results" aria-label="Search Results"
        aria-busy="false" aria-expanded="false"
        aria-atomic="false" class="initially-hidden"></ul>
  </form>
</div>

    </div>


    

    <button id='toggleThing' @click="toggleNav()" >Show/hide navigation</button>
    <div :class="isOpen ? 'block' : 'hidden' " id='toggleMe'>
      <div id="class-metadata">
        
        
<div id="parent-class-section" class="nav-section">
  <h3>Parent</h3>

  <p class="link">Object
</div>

        
        
        
<!-- Method Quickref -->
<div id="method-list-section" class="nav-section">
  <h3>Methods</h3>

  <ul class="link-list" role="directory">
    <li ><a href="#method-c-new">::new</a>
    <li ><a href="#method-i-call">#call</a>
    <li ><a href="#method-i-capture_before_after_kws">#capture_before_after_kws</a>
    <li ><a href="#method-i-capture_falling_indent">#capture_falling_indent</a>
    <li ><a href="#method-i-capture_first_kw_end_same_indent">#capture_first_kw_end_same_indent</a>
    <li ><a href="#method-i-capture_last_end_same_indent">#capture_last_end_same_indent</a>
    <li ><a href="#method-i-sorted_lines">#sorted_lines</a>
  </ul>
</div>

      </div>
     </div>
    </nav>


    <div id='extraz'><div class='adzbox-index'  >
      
     </div>         
    </div>

    <main role="main" aria-labelledby="class-SyntaxSuggest::CaptureCodeContext">
    <h1 id="class-SyntaxSuggest::CaptureCodeContext" class="class">
      class SyntaxSuggest::CaptureCodeContext
    </h1>

    <section class="description">
    
<p>Turns a “invalid block(s)” into useful context</p>

<p>There are three main phases in the algorithm:</p>
<ol><li>
<p>Sanitize/format input source</p>
</li><li>
<p>Search for invalid blocks</p>
</li><li>
<p>Format invalid blocks into something meaninful</p>
</li></ol>

<p>This class handles the third part.</p>

<p>The algorithm is very good at capturing all of a syntax error in a single block in number 2, however the results can contain ambiguities. Humans are good at pattern matching and filtering and can mentally remove extraneous data, but they can’t add extra data that’s not present.</p>

<p>In the case of known ambiguious cases, this class adds context back to the ambiguitiy so the programmer has full information.</p>

<p>Beyond handling these ambiguities, it also captures surrounding code context information:</p>

<pre>puts block.to_s # =&gt; &quot;def bark&quot;

context = CaptureCodeContext.new(
  blocks: block,
  code_lines: code_lines
)

lines = context.call.map(&amp;:original)
puts lines.join
# =&gt;
  class Dog
    def bark
  end</pre>

    </section>

      <section id="5Buntitled-5D" class="documentation-section">



        <section class="attribute-method-details" class="method-section">
        <header>
        <h3>Attributes</h3>
        </header>

          <div id="attribute-i-code_lines" class="method-detail">
            <div class="method-heading attribute-method-heading">
              <span class="method-name">code_lines</span><span
                class="attribute-access-type">[R]</span>
            </div>

            <div class="method-description">
              
              </div>
            </div>
            </section>


                <section id="public-class-5Buntitled-5D-method-details" class="method-section">
                <header>
                <h3>Public Class Methods</h3>
                </header>

                  <div id="method-c-new" class="method-detail ">
                            <div class="method-heading">
                              <span class="method-name">new</span><span
                                class="method-args">(blocks:, code_lines:)</span>
                              <span class="method-click-advice">click to toggle source</span>
                            </div>

                            <div class="method-description">
                              

                              <div class="method-source-code" id="new-source">
            <pre><span class="ruby-comment"># File syntax_suggest/capture_code_context.rb, line 51</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">initialize</span>(<span class="ruby-value">blocks:</span>, <span class="ruby-value">code_lines:</span>)
  <span class="ruby-ivar">@blocks</span> = <span class="ruby-constant">Array</span>(<span class="ruby-identifier">blocks</span>)
  <span class="ruby-ivar">@code_lines</span> = <span class="ruby-identifier">code_lines</span>
  <span class="ruby-ivar">@visible_lines</span> = <span class="ruby-ivar">@blocks</span>.<span class="ruby-identifier">map</span>(<span class="ruby-operator">&amp;</span><span class="ruby-value">:visible_lines</span>).<span class="ruby-identifier">flatten</span>
  <span class="ruby-ivar">@lines_to_output</span> = <span class="ruby-ivar">@visible_lines</span>.<span class="ruby-identifier">dup</span>
<span class="ruby-keyword">end</span></pre>
                              </div>
                            </div>


                          </div>

                          </section>

                <section id="public-instance-5Buntitled-5D-method-details" class="method-section">
                <header>
                <h3>Public Instance Methods</h3>
                </header>

                  <div id="method-i-call" class="method-detail ">
                            <div class="method-heading">
                              <span class="method-name">call</span><span
                                class="method-args">()</span>
                              <span class="method-click-advice">click to toggle source</span>
                            </div>

                            <div class="method-description">
                              

                              <div class="method-source-code" id="call-source">
            <pre><span class="ruby-comment"># File syntax_suggest/capture_code_context.rb, line 58</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">call</span>
  <span class="ruby-ivar">@blocks</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">block</span><span class="ruby-operator">|</span>
    <span class="ruby-identifier">capture_first_kw_end_same_indent</span>(<span class="ruby-identifier">block</span>)
    <span class="ruby-identifier">capture_last_end_same_indent</span>(<span class="ruby-identifier">block</span>)
    <span class="ruby-identifier">capture_before_after_kws</span>(<span class="ruby-identifier">block</span>)
    <span class="ruby-identifier">capture_falling_indent</span>(<span class="ruby-identifier">block</span>)
  <span class="ruby-keyword">end</span>

  <span class="ruby-identifier">sorted_lines</span>
<span class="ruby-keyword">end</span></pre>
                              </div>
                            </div>


                          </div>

                  <div id="method-i-capture_before_after_kws" class="method-detail ">
                            <div class="method-heading">
                              <span class="method-name">capture_before_after_kws</span><span
                                class="method-args">(block)</span>
                              <span class="method-click-advice">click to toggle source</span>
                            </div>

                            <div class="method-description">
                              <p>Shows surrounding kw/end pairs</p>

<p>The purpose of showing these extra pairs is due to cases of ambiguity when only one visible line is matched.</p>

<p>For example:</p>

<pre>1  class Dog
2    def bark
4    def eat
5    end
6  end</pre>

<p>In this case either line 2 could be missing an ‘end` or line 4 was an extra line added by mistake (it happens).</p>

<p>When we detect the above problem it shows the issue as only being on line 2</p>

<pre>2    def bark</pre>

<p>Showing “neighbor” keyword pairs gives extra context:</p>

<pre>2    def bark
4    def eat
5    end</pre>

                              <div class="method-source-code" id="capture_before_after_kws-source">
            <pre><span class="ruby-comment"># File syntax_suggest/capture_code_context.rb, line 127</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">capture_before_after_kws</span>(<span class="ruby-identifier">block</span>)
  <span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">block</span>.<span class="ruby-identifier">visible_lines</span>.<span class="ruby-identifier">count</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span>

  <span class="ruby-identifier">around_lines</span> = <span class="ruby-constant">Capture</span><span class="ruby-operator">::</span><span class="ruby-constant">BeforeAfterKeywordEnds</span>.<span class="ruby-identifier">new</span>(
    <span class="ruby-value">code_lines:</span> <span class="ruby-ivar">@code_lines</span>,
    <span class="ruby-value">block:</span> <span class="ruby-identifier">block</span>
  ).<span class="ruby-identifier">call</span>

  <span class="ruby-identifier">around_lines</span> <span class="ruby-operator">-=</span> <span class="ruby-identifier">block</span>.<span class="ruby-identifier">lines</span>

  <span class="ruby-ivar">@lines_to_output</span>.<span class="ruby-identifier">concat</span>(<span class="ruby-identifier">around_lines</span>)
<span class="ruby-keyword">end</span></pre>
                              </div>
                            </div>


                          </div>

                  <div id="method-i-capture_falling_indent" class="method-detail ">
                            <div class="method-heading">
                              <span class="method-name">capture_falling_indent</span><span
                                class="method-args">(block)</span>
                              <span class="method-click-advice">click to toggle source</span>
                            </div>

                            <div class="method-description">
                              <p>Shows the context around code provided by “falling” indentation</p>

<p>Converts:</p>

<pre>it &quot;foo&quot; do</pre>

<p>into:</p>

<pre>class OH
  def hello
    it &quot;foo&quot; do
  end
end</pre>

                              <div class="method-source-code" id="capture_falling_indent-source">
            <pre><span class="ruby-comment"># File syntax_suggest/capture_code_context.rb, line 91</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">capture_falling_indent</span>(<span class="ruby-identifier">block</span>)
  <span class="ruby-constant">Capture</span><span class="ruby-operator">::</span><span class="ruby-constant">FallingIndentLines</span>.<span class="ruby-identifier">new</span>(
    <span class="ruby-value">block:</span> <span class="ruby-identifier">block</span>,
    <span class="ruby-value">code_lines:</span> <span class="ruby-ivar">@code_lines</span>
  ).<span class="ruby-identifier">call</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">line</span><span class="ruby-operator">|</span>
    <span class="ruby-ivar">@lines_to_output</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">line</span>
  <span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
                              </div>
                            </div>


                          </div>

                  <div id="method-i-capture_first_kw_end_same_indent" class="method-detail ">
                            <div class="method-heading">
                              <span class="method-name">capture_first_kw_end_same_indent</span><span
                                class="method-args">(block)</span>
                              <span class="method-click-advice">click to toggle source</span>
                            </div>

                            <div class="method-description">
                              <p>The logical inverse of ‘capture_last_end_same_indent`</p>

<p>When there is an invalid block with an ‘end` missing a keyword right after another `end`, it is unclear where which end is missing the keyword.</p>

<p>Take this example:</p>

<pre>class Dog       # 1
    puts &quot;woof&quot; # 2
  end           # 3
end             # 4</pre>

<p>the problem line will be identified as:</p>

<pre>&gt; end            # 4</pre>

<p>This happens because lines 1, 2, and 3 are technically valid code and are expanded first, deemed valid, and hidden. We need to un-hide the matching keyword on line 1. Also work backwards and if there’s a mis-matched end, show it too</p>

                              <div class="method-source-code" id="capture_first_kw_end_same_indent-source">
            <pre><span class="ruby-comment"># File syntax_suggest/capture_code_context.rb, line 221</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">capture_first_kw_end_same_indent</span>(<span class="ruby-identifier">block</span>)
  <span class="ruby-keyword">return</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">block</span>.<span class="ruby-identifier">visible_lines</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">!=</span> <span class="ruby-value">1</span>
  <span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">block</span>.<span class="ruby-identifier">visible_lines</span>.<span class="ruby-identifier">first</span>.<span class="ruby-identifier">is_end?</span>

  <span class="ruby-identifier">visible_line</span> = <span class="ruby-identifier">block</span>.<span class="ruby-identifier">visible_lines</span>.<span class="ruby-identifier">first</span>
  <span class="ruby-identifier">lines</span> = <span class="ruby-ivar">@code_lines</span>[<span class="ruby-identifier">block</span>.<span class="ruby-identifier">lines</span>.<span class="ruby-identifier">first</span>.<span class="ruby-identifier">index</span><span class="ruby-operator">..</span><span class="ruby-identifier">visible_line</span>.<span class="ruby-identifier">index</span>]
  <span class="ruby-identifier">matching_kw</span> = <span class="ruby-identifier">lines</span>.<span class="ruby-identifier">reverse</span>.<span class="ruby-identifier">detect</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">line</span><span class="ruby-operator">|</span> <span class="ruby-identifier">line</span>.<span class="ruby-identifier">indent</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">block</span>.<span class="ruby-identifier">current_indent</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">line</span>.<span class="ruby-identifier">is_kw?</span> }
  <span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">matching_kw</span>

  <span class="ruby-ivar">@lines_to_output</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">matching_kw</span>

  <span class="ruby-identifier">kw_count</span> = <span class="ruby-value">0</span>
  <span class="ruby-identifier">end_count</span> = <span class="ruby-value">0</span>
  <span class="ruby-identifier">orphan_end</span> = <span class="ruby-ivar">@code_lines</span>[<span class="ruby-identifier">matching_kw</span>.<span class="ruby-identifier">index</span><span class="ruby-operator">..</span><span class="ruby-identifier">visible_line</span>.<span class="ruby-identifier">index</span>].<span class="ruby-identifier">detect</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">line</span><span class="ruby-operator">|</span>
    <span class="ruby-identifier">kw_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">line</span>.<span class="ruby-identifier">is_kw?</span>
    <span class="ruby-identifier">end_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">line</span>.<span class="ruby-identifier">is_end?</span>

    <span class="ruby-identifier">end_count</span> <span class="ruby-operator">&gt;=</span> <span class="ruby-identifier">kw_count</span>
  <span class="ruby-keyword">end</span>

  <span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">orphan_end</span>
  <span class="ruby-ivar">@lines_to_output</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">orphan_end</span>
<span class="ruby-keyword">end</span></pre>
                              </div>
                            </div>


                          </div>

                  <div id="method-i-capture_last_end_same_indent" class="method-detail ">
                            <div class="method-heading">
                              <span class="method-name">capture_last_end_same_indent</span><span
                                class="method-args">(block)</span>
                              <span class="method-click-advice">click to toggle source</span>
                            </div>

                            <div class="method-description">
                              <p>When there is an invalid block with a keyword missing an end right before another end, it is unclear where which keyword is missing the end</p>

<p>Take this example:</p>

<pre>class Dog       # 1
  def bark      # 2
    puts &quot;woof&quot; # 3
end             # 4</pre>

<p>However due to <a href="https://github.com/ruby/syntax_suggest/issues/32">github.com/ruby/syntax_suggest/issues/32</a> the problem line will be identified as:</p>

<pre>&gt; class Dog       # 1</pre>

<p>Because lines 2, 3, and 4 are technically valid code and are expanded first, deemed valid, and hidden. We need to un-hide the matching end line 4. Also work backwards and if there’s a mis-matched keyword, show it too</p>

                              <div class="method-source-code" id="capture_last_end_same_indent-source">
            <pre><span class="ruby-comment"># File syntax_suggest/capture_code_context.rb, line 161</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">capture_last_end_same_indent</span>(<span class="ruby-identifier">block</span>)
  <span class="ruby-keyword">return</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">block</span>.<span class="ruby-identifier">visible_lines</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">!=</span> <span class="ruby-value">1</span>
  <span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">block</span>.<span class="ruby-identifier">visible_lines</span>.<span class="ruby-identifier">first</span>.<span class="ruby-identifier">is_kw?</span>

  <span class="ruby-identifier">visible_line</span> = <span class="ruby-identifier">block</span>.<span class="ruby-identifier">visible_lines</span>.<span class="ruby-identifier">first</span>
  <span class="ruby-identifier">lines</span> = <span class="ruby-ivar">@code_lines</span>[<span class="ruby-identifier">visible_line</span>.<span class="ruby-identifier">index</span><span class="ruby-operator">..</span><span class="ruby-identifier">block</span>.<span class="ruby-identifier">lines</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">index</span>]

  <span class="ruby-comment"># Find first end with same indent</span>
  <span class="ruby-comment"># (this would return line 4)</span>
  <span class="ruby-comment">#</span>
  <span class="ruby-comment">#   end             # 4</span>
  <span class="ruby-identifier">matching_end</span> = <span class="ruby-identifier">lines</span>.<span class="ruby-identifier">detect</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">line</span><span class="ruby-operator">|</span> <span class="ruby-identifier">line</span>.<span class="ruby-identifier">indent</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">block</span>.<span class="ruby-identifier">current_indent</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">line</span>.<span class="ruby-identifier">is_end?</span> }
  <span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">matching_end</span>

  <span class="ruby-ivar">@lines_to_output</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">matching_end</span>

  <span class="ruby-comment"># Work backwards from the end to</span>
  <span class="ruby-comment"># see if there are mis-matched</span>
  <span class="ruby-comment"># keyword/end pairs</span>
  <span class="ruby-comment">#</span>
  <span class="ruby-comment"># Return the first mis-matched keyword</span>
  <span class="ruby-comment"># this would find line 2</span>
  <span class="ruby-comment">#</span>
  <span class="ruby-comment">#     def bark      # 2</span>
  <span class="ruby-comment">#       puts &quot;woof&quot; # 3</span>
  <span class="ruby-comment">#   end             # 4</span>
  <span class="ruby-identifier">end_count</span> = <span class="ruby-value">0</span>
  <span class="ruby-identifier">kw_count</span> = <span class="ruby-value">0</span>
  <span class="ruby-identifier">kw_line</span> = <span class="ruby-ivar">@code_lines</span>[<span class="ruby-identifier">visible_line</span>.<span class="ruby-identifier">index</span><span class="ruby-operator">..</span><span class="ruby-identifier">matching_end</span>.<span class="ruby-identifier">index</span>].<span class="ruby-identifier">reverse</span>.<span class="ruby-identifier">detect</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">line</span><span class="ruby-operator">|</span>
    <span class="ruby-identifier">end_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">line</span>.<span class="ruby-identifier">is_end?</span>
    <span class="ruby-identifier">kw_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">line</span>.<span class="ruby-identifier">is_kw?</span>

    <span class="ruby-operator">!</span><span class="ruby-identifier">kw_count</span>.<span class="ruby-identifier">zero?</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">kw_count</span> <span class="ruby-operator">&gt;=</span> <span class="ruby-identifier">end_count</span>
  <span class="ruby-keyword">end</span>
  <span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">kw_line</span>
  <span class="ruby-ivar">@lines_to_output</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">kw_line</span>
<span class="ruby-keyword">end</span></pre>
                              </div>
                            </div>


                          </div>

                  <div id="method-i-sorted_lines" class="method-detail ">
                            <div class="method-heading">
                              <span class="method-name">sorted_lines</span><span
                                class="method-args">()</span>
                              <span class="method-click-advice">click to toggle source</span>
                            </div>

                            <div class="method-description">
                              

                              <div class="method-source-code" id="sorted_lines-source">
            <pre><span class="ruby-comment"># File syntax_suggest/capture_code_context.rb, line 69</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">sorted_lines</span>
  <span class="ruby-ivar">@lines_to_output</span>.<span class="ruby-identifier">select!</span>(<span class="ruby-operator">&amp;</span><span class="ruby-value">:not_empty?</span>)
  <span class="ruby-ivar">@lines_to_output</span>.<span class="ruby-identifier">uniq!</span>
  <span class="ruby-ivar">@lines_to_output</span>.<span class="ruby-identifier">sort!</span>

  <span class="ruby-ivar">@lines_to_output</span>
<span class="ruby-keyword">end</span></pre>
                              </div>
                            </div>


                          </div>

                          </section>

              </section>
              </main>



            </div>  <!--  class='wrapper hdiv' -->


<footer id="validator-badges" role="contentinfo">
<p><a href="https://validator.w3.org/check/referer">Validate</a></p>
<p>Generated by <a href="https://ruby.github.io/rdoc/">RDoc</a> 6.4.0.</p>
<p>Based on <a href="https://github.com/ged/darkfish/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.</p>

  
    <p><p><a href="https://ruby-doc.org">Ruby-doc.org</a> is provided by <a href="https://jamesbritt.com">James Britt</a> and <a href="https://neurogami.com">Neurogami</a>.</p><p><a href="https://jamesbritt.bandcamp.com/">Maximum R+D</a>.  </p>
</p>
  
  </footer>

<script type="text/javascript">


  let ads  = $("#carbonads-container").children().detach();


  function swapMode() {
    var cookieName = 'darkmode';
    var cssDarkmode = Cookies.get(cookieName);
    console.log("***** swapMode! " + cssDarkmode + " *****");


    if (cssDarkmode == "true") {
      console.log("We have dark mode, set the css to light ...");
      $('#rdoccss').attr("href", defaultModeCssHref);
      $('#cssSelect').text("Dark mode");
      cssDarkmode = "false";
      console.log("swapMode! Now set cookie to " + cssDarkmode);
      Cookies.set(cookieName, cssDarkmode);

    } else {
      console.log("We not have dark mode, set the css to dark ...");
      $('#rdoccss').attr("href", darkModeCsseHref);
      $('#cssSelect').text("Light mode");
      cssDarkmode = "true";
      console.log("swapMode! Now set cookie to " + cssDarkmode);
      Cookies.set(cookieName, cssDarkmode);

    }

    console.log("  --------------- ");
  }


const vueCssApp = new Vue({
el: '#menubar',
data: {
isDark: false
},
methods: {
toggleClass: function(event){
this.isDark = !this.isDark;
}
}
})

const vueApp = new Vue({
el: '#vapp',
data: { 
isOpen: true
},

mounted() {
this.handleResize();
this.manage_mob_classes();
window.addEventListener('resize', this.handleResize)
//this.isOpen !=  (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));
},
destroyed() {
window.removeEventListener('resize', this.handleResize)
},
created() {
//manage_mob_classes();
},

methods : {
isMobile() {
  return (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));
},

  handleResize() {
    if (!this.isMobile()) {
      this.isOpen = window.innerWidth > 800;
    }
  },

  manage_mob_classes() {
    if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
      $("nav").addClass("mob_nav");
      $("main").addClass("mob_main");
      $("#extraz").addClass("mob_extraz");
      $("#carbonads-container").addClass("mob_carbonads-container");
      this.isOpen  = false;
    } else {
      $("nav").removeClass("mob_nav") 
        $("main").removeClass("mob_main");
      $("#extraz").removeClass("mob_extraz");
      $("#carbonads-container").removeClass("mob_carbonads-container");
      this.isOpen  = true;
    }
  },

  toggleNav() {
    this.isOpen =! this.isOpen ;
    // alert("Toggle nav!");
    console.log("toggleNav() click: " + this.isOpen );
  }
}
})

$("#carbonads-container").append(ads);


$(function() {

    var darkmode = Cookies.get("darkmode");
    console.log("Document ready: " + darkmode);

    if ( darkmode  == "true" ) {
      $('#cssSelect').text("Light mode");
    } else {
      $('#cssSelect').text("Dark mode");
     }

    $('body').css('display','block');
    });

</script>

    
  </body> 
</html>

